package com.qdlc.p2p.biz.service.lottery;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.qdlc.p2p.biz.zdata.LotteryResult;
import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.Lottery;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.model.LotteryModel;

/**
 * 抽奖服务
 */
public abstract class AbstractLotteryService implements LotteryService {

    /**
     * 抽奖流程
     *
     * @param user
     * @return
     */
    @Override
    public Object process(User user, int category) {
        validation(user); // 可抽奖验证
        use(user, getConsume()); // 花费
        LotteryResult result = drawLottery(user, category); // 抽奖结果
        return award(user, result); // 颁奖
    }

    /**
     * 抽奖算法
     *
     * @return 中奖索引号
     */
    protected int drawLotteryAlgorithm(List<Double> orignalRates) {
        // 计算总概率，这样可以保证不一定总概率是1
        double sumRate = 0d;
        for (double rate : orignalRates) {
            sumRate += rate;
        }

        // 未设置中奖概率
        if(sumRate == 0d) return -1;

        // 计算每个物品在总概率的基础下的概率情况
        List<Double> sortOrignalRates = new ArrayList<Double>(orignalRates.size());
        Double tempSumRate = 0d;
        for (double rate : orignalRates) {
            tempSumRate += rate;
            sortOrignalRates.add(tempSumRate / sumRate);
        }

        // 根据区块值来获取抽取到的物品索引
        double nextDouble = Math.random();
        sortOrignalRates.add(nextDouble);
        Collections.sort(sortOrignalRates);
        // 找出中奖索引位置 就是中奖结果
        return sortOrignalRates.indexOf(nextDouble);
    }


    /**
     * 可否抽奖验证
     * 积分够不够等
     *
     * @param user
     * @return false:不可抽奖 true:可抽奖
     */
    protected abstract void validation(User user);

    /**
     * 使用
     *
     * @param user
     */
    protected abstract void use(User user, int count);

    /**
     * 抽奖
     *
     * @param user
     */
    protected abstract LotteryResult drawLottery(User user, int category);

    /**
     * 颁奖
     *
     * @param user
     */
    protected abstract Object award(User user, LotteryResult result);

    /**
     * 取得消耗
     *
     * @return 消耗
     */
    protected int getConsume() {
        return 0;
    }


    /**
     * -------------Lottery配置CURD--------------------
     *
     */
    @Override
    public Lottery save(LotteryModel model) {
        return null;
    }

    @Override
    public Lottery update(Lottery lottery) {
        return null;
    }

    @Override
    public PageDataList<Lottery> getAllLottery(LotteryModel model) {
        return null;
    }

    @Override
    public Lottery findById(long id) {
        return null;
    }

    @Override
    public double getTotalRate(int category) {
        return 0;
    }

    @Override
    public List<Lottery> getLotteryByCategory(int category) {
        return null;
    }
}